<?php
/**
 * sys debugger
 * @package kernel_lib_sys
 */
/**
 * sys debugger
 * @author pandajingjing
 * @package kernel_lib_sys
 */
class sys_debugger{

	/**
	 * 系统debug实例
	 * @var object
	 */
	private static $_objInstance=NULL;

	/**
	 * 需要输出的信息
	 * @var array
	 */
	private $_arrMessage=array();

	/**
	 * 调试信息
	 * @var array
	 */
	private $_arrDebugInfo=array();

	/**
	 * 系统参数
	 * @var array $_arrParam
	 */
	private $_arrParam=array();

	/**
	 * 是否开启debug
	 * @var boolean
	 */
	private $_bolNeedDebug=false;

	/**
	 * 开始时间
	 * @var float
	 */
	private $_floStartTime;

	/**
	 * 系统变量
	 * @var object
	 */
	private $_objVari;

	/**
	 * 构造函数
	 */
	private function __construct(){
		$this->_objVari=sys_variable::getInstance();
		$this->_floStartTime=$this->_objVari->getMicroTime();
		$mixWeWantDebug=$this->_objVari->getParam('debug');
		if(NULL!==$mixWeWantDebug){
			if(1==$mixWeWantDebug){
				$this->_objVari->setCookie('debug',1,600);
			}else{
				$this->_objVari->setCookie('debug',0,1);
			}
		}
		if(get_config('debug') and $this->_canDebugIP($this->_objVari->getParam('CLIENTIP','server')) and $mixWeWantDebug){
			$this->_bolNeedDebug=true;
		}else{
			$this->_bolNeedDebug=false;
		}
	}

	/**
	 * 构造函数
	 */
	private function __clone(){

	}

	/**
	 * 获取实例
	 * @return object
	 */
	static function getInstance(){
		if(!(self::$_objInstance instanceof self)){
			self::$_objInstance=new self();
		}
		return self::$_objInstance;
	}

	/**
	 * 添加输出信息
	 * @param string $p_strMsg
	 * @param boolean $p_bolIsHTML
	 */
	function showMsg($p_strMsg,$p_bolIsHTML=false){
		if($this->_bolNeedDebug){
			$floTmpTime=$this->_objVari->getMicroTime();
			$this->_arrMessage[]=array( 
					'TIME'=>$floTmpTime,
					'TIMECOST'=>$floTmpTime-$this->_floStartTime,
					'MESSAGE'=>$p_bolIsHTML?$p_strMsg:htmlspecialchars($p_strMsg) 
			);
		}
	}

	/**
	 * 开始调试信息
	 * @param string $p_strModule
	 */
	function startDebug($p_strModule){
		if($this->_bolNeedDebug){
			$this->_arrDebugInfo[$p_strModule]['STARTTIME']=$this->_objVari->getMicroTime();
			$this->_arrDebugInfo[$p_strModule]['STARTMEMORY']=$this->_getMemoryUsage();
		}
	}

	/**
	 * 结束调试信息
	 * @param string $p_strModule
	 */
	function stopDebug($p_strModule=''){
		if($this->_bolNeedDebug){
			$this->_arrDebugInfo[$p_strModule]['ENDTIME']=$this->_objVari->getMicroTime();
			$this->_arrDebugInfo[$p_strModule]['ENDMEMORY']=$this->_getMemoryUsage();
		}
	}

	/**
	 * 返回输出信息
	 * @return array
	 */
	function getMsgs(){
		return $this->_arrMessage;
	}

	/**
	 * 返回调试信息
	 * @return array
	 */
	function getDebugInfo(){
		return $this->_arrDebugInfo;
	}

	/**
	 * 设置debug的控制器
	 * @param string $p_strController
	 */
	function setDebugController($p_strController){
		$arrExcludeController=get_config('exclude_controller','debug');
		if(in_array($p_strController,$arrExcludeController)){
			$this->_bolNeedDebug=false;
		}
	}

	/**
	 * 获取系统参数
	 * @return array
	 */
	function getParams(){
		return array( 
				'POST'=>$this->_objVari->getParams('post'),
				'GET'=>$this->_objVari->getParams('get'),
				'URL'=>$this->_objVari->getParams('url'),
				'COOKIE'=>$this->_objVari->getParams('cookie'),
				'SERVER'=>$this->_objVari->getParams('server'),
				'CONFIG'=>$this->_objVari->getParams('config') 
		);
	}

	/**
	 * 是否能够debug
	 * @return true/false
	 */
	function canDebug(){
		return $this->_bolNeedDebug;
	}

	/**
	 * 获取内存使用量
	 */
	private function _getMemoryUsage(){
		return function_exists('memory_get_usage')?memory_get_usage():0;
	}

	/**
	 * 判断IP是否能够打开Debug
	 * @param unknown_type $p_strIP
	 */
	private function _canDebugIP($p_strIP){
		$arrAllowIPs=get_config('allowed_ips','debug');
		return true;
	}
}